﻿#ifndef __THREADPOOLOBJECT_H__
#define __THREADPOOLOBJECT_H__

#include <atomic>
#include <condition_variable>
#include <mutex>
#include <thread>
#include "AtomicQueue.h"
#include "HThreadObject.h"
#include "Task.h"
#include "ThreadObject.h"

// 1. **核心线程（core thread）：**
//    * 这是线程池中始终保持活动的线程数量。
//    * 无论线程池是否空闲，核心线程都将始终运行。
//    * 核心线程的数量通常由应用程序的需要决定。

// 2. **空闲线程（idle thread）：**
//    * 这是线程池中当前未处理任何任务的线程。
//    * 空闲线程将在一段时间内保持活动状态，然后被终止。
//    * 空闲线程的数量通常由应用程序的需要和可用资源决定。

// 3. **守护线程（daemon thread）：**
//    * 这是线程池中的线程，但在线程池终止时会自动终止。
//    * 守护线程通常用于执行后台任务，例如清理或日志记录。

HTHREADPOOL_NAMESPACE_BEGIN

    //为了后续扩展
    class ThreadPoolObject : public ThreadObject
    {
    public:
        ThreadPoolObject(ThreadType type, AtomicQueue<Task>* poolTaskQueue);
        virtual ~ThreadPoolObject();
        void               runTask(Task& task);       // 执行单个任务
        void               runTasks(TaskArr& tasks);  // 一次执行多个任务
        unsigned long long getExcuteTasks();          // 获取该线程执行的任务数量

    protected:
        virtual void run()         = 0;              // 执行任务体
        virtual void excuteTask()  = 0;              // 执行单个任务
        virtual void excuteTasks() = 0;              // 执行批量任务
        bool         popPoolTask(TaskArrRef tasks);  // 从线程池任务队列中弹出批量任务
        bool         popPoolTask(TaskRef task);      // 从线程池任务队列中弹出单个任务

    protected:
        unsigned long long m_excuteTotalTaskNum;  // 执行过的任务数量
        AtomicQueue<Task>* m_poolTaskQueue;       // 线程池中非优先级任务
        std::atomic<bool>  m_isBatchExecution;
    };

HTHREADPOOL_NAMESPACE_END

#endif
